#include <iostream>

/*
    为创建一个需要动态绑定的成员函数，可以在这个函数声明前加上virtual 关键字，定义时候不需要
    如果一个函数在基类中被声明为virtual 那么在所有派生类中它都是 virtual 的
    在派生类中 virtual 函数的重定义称为重写 (override)
    virtual 关键字只能修饰成员函数
    构造函数不能为虚函数
*/

class Animal
{
public:
    virtual void bark() // 虚函数父类也可以直接调用
    {
        std::cout << "Animal Barking" << std::endl;
    }
};

class Dog : public Animal
{
public:
    void bark() override
    {
        std::cout << "Dog Barking" << std::endl;
    }
};

int main(int argc, char const *argv[])
{
    
    Animal animal;

    animal.bark();

    Dog dog;
    Animal& dogAnimal = dog;
    dogAnimal.bark();
    return 0;
}
